Exponential Backoff
イーサネットフレームのデータ送信時にコリジョン(衝突)を検出したら一定時間待機して再送して、処理を完結させるためのアルゴリズムとして古くから使われている リトライ間隔を指数関数的に増加させる
例: $ \{1,2,4,8,16...\}
長期障害発生時にシステムへの不必要な負担を軽減
大規模分散システム内では常に部分障害(特に一時的)が発生している 障害発生時にいちいちシステムを止めていては高可用性を実現できない リトライにより後に成功する可能性が高い
レスポンスステータスやエラーコードによりリトライの指針は異なってくる
サービス利用者としてはサービスの説明をよく読む
サービス提供者としてはよく考えて設計する
例
200: リトライ不要
400: 非推奨(リトライしても成功しない)
500: リトライ推奨
503: リトライ推奨
例外発生時のクライアント側のコード
Javaでいうとjava.lang.RuntimeExceptionを継承している
常に部分的な障害があるのでいちいちエラーキャッチするコードを強制されているとクリーンなコードが書けない
リトライ処理だけを抽象化したライブラリもある